package com.demo.enums;

import lombok.Getter;

import java.util.Arrays;
import java.util.Optional;

/**
 * @author wangfengchen
 * <a href="https://docs.sumsub.com/docs/user-verification-webhooks#applicantworkflowcompleted">https://docs.sumsub.com/docs/user-verification-webhooks#applicantworkflowcompleted</a>
 */
@Getter
public enum KycWebHookTypeEnum {

  /**
   * 申请人已创建
   */
  APPLICANT_CREATED("applicantCreated"),
  /**
   * 申请人已上传所需文件，其状态已更改为待处理
   */
  APPLICANT_PENDING("applicantPending"),
  /**
   * 验证完成。包含验证结果
   */
  APPLICANT_REVIEWED("applicantReviewed"),
  /**
   * 申请人资料的进一步处理被搁置
   */
  APPLICANT_ON_HOLD("applicantOnHold"),
  /**
   * 申请人行动状态更改为待定
   */
  APPLICANT_ACTION_PENDING("applicantActionPending"),
  /**
   * 申请人行动验证已完成
   */
  APPLICANT_ACTION_REVIEWED("applicantActionReviewed"),
  /**
   * 申请人行动验证已暂停
   */
  APPLICANT_ACTION_ON_HOLD("applicantActionOnHold"),
  /**
   * 申请人个人信息已更改，或申请人处于已完成状态，申请人文件中的信息也已更改。
   */
  APPLICANT_PERSONAL_INFO_CHANGED("applicantPersonalInfoChanged"),
  /**
   * 申请人标签已被修改
   */
  APPLICANT_TAGS_CHANGED("applicantTagsChanged"),
  /**
   * 申请人资料已设置为活跃状态
   */
  APPLICANT_ACTIVATED("applicantActivated"),
  /**
   * 申请人资料已被停用
   */
  APPLICANT_DEACTIVATED("applicantDeactivated"),
  /**
   * 申请人已被永久删除
   */
  APPLICANT_DELETED("applicantDeleted"),
  /**
   * 申请人已重置——申请人状态更改为init，所有文档均设置为非活动状态
   */
  APPLICANT_RESET("applicantReset"),
  /**
   * 初步数据处理完成
   */
  APPLICANT_PRECHECKED("applicantPrechecked"),
  /**
   * 申请人级别已更改
   */
  APPLICANT_LEVEL_CHANGED("applicantLevelChanged"),
  /**
   * 申请人的工作流程已完成
   */
  APPLICANT_WORKFLOW_COMPLETED("applicantWorkflowCompleted"),
  /**
   * 视频识别类型的状态已更改
   */
  VIDEO_IDENT_STATUS_CHANGED("videoIdentStatusChanged"),

  ;


  /**
   * 描述
   */
  private final String desc;

  KycWebHookTypeEnum(String desc) {
    this.desc = desc;
  }


  public static KycWebHookTypeEnum match(String name) {
    Optional<KycWebHookTypeEnum> target = Arrays.stream(KycWebHookTypeEnum.values()).filter(item -> name.equalsIgnoreCase(item.getDesc()))
        .findFirst();
    return target.orElse(null);
  }

}
